// interface接口   用于键值对、JSON数据的自定义约束
// 命名使用大驼峰
interface UserType {
	readonly name:string  //只读字段
	age:number
	skills?:string[]  //可选参数
	update?:()=>void  //函数类型
}

let user:UserType = {
	name:'三丰',
	age:100,
	update:()=>{
		console.log('调用了update');
	}
}
// user.score = 100  //会告警
user.skills = ['太极']
// user.name = '无忌' //尝试修改只读字段，会告警
if(user.update){
	user.update()
}


//动态可索引属性（鸿蒙中使用需要注意）
// 相对较少使用
interface DynamicType {
	[key:string]:string
}

let d:DynamicType = {
	'123':'123456',
	'a':'true', 
	'c':'Hello'
}
console.log(d['123'],d.a);


// 使用接口来约定函数   （较少使用）
interface Sum {
	(a:number,b:number):number
}

let sum:Sum = (m,n)=>{
	return m+n
}


//接口继承
// 好处：可以解决接口之间的字段复用
// 弊端：会让代码耦合度变高、代码拆分及复用等会受影响
// 代码建议：低耦合、高内聚  （组件封装的开放封闭原则）
//生命体 ---- 动物 ---- 人
interface LiveType {
	move:boolean
	breath:()=>void
}

interface Animal extends LiveType{
	name:string
	age:number
}

let cat:Animal = {
	name:'猫',
	age:2,
	move:true,
	breath() {
		console.log(this.name+'在呼吸');
	}
}

interface Person extends Animal {
	coding:()=>void
}

let p:Person = {
	name:'程序猿',
	age:20,
	move:true,
	breath() {
		console.log(this.name+'在呼吸');
	},
	coding(){
		
	}
}

cat.breath()
p.breath()